package cn.mitool.core.crypto;

import cn.mitool.core.crypto.digest.MD5;
import cn.mitool.core.crypto.digest.SHA1;
import cn.mitool.core.crypto.digest.SHA256;
import cn.mitool.core.crypto.digest.SHA384;
import cn.mitool.core.crypto.digest.SHA512;

import java.io.IOException;
import java.io.InputStream;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;

/**
 * 安全相关工具类
 * 加密分为三种：
 * 1、对称加密（symmetric），例如：AES、DES等
 * 2、非对称加密（asymmetric），例如：RSA、DSA等
 * 3、摘要加密（digest），例如：MD5、SHA-1、SHA-256、HMAC等
 *
 * @author dragon
 * @version 1.0
 * @date 2024/6/28 17:33
 */
public class SecureUtil {

    /*======================================= MD5摘要 =======================================*/

    public static MD5 md5() {
        return new MD5();
    }

    public static String md5(String data) throws NoSuchAlgorithmException {
        return md5().digestHex(data);
    }

    public static String md5(InputStream data) throws IOException, NoSuchAlgorithmException {
        return md5().digestHex(data);
    }

    public static String md5(byte[] data) throws NoSuchAlgorithmException {
        return md5().digestHex(data);
    }


    /*======================================= SHA-1摘要 =======================================*/

    public static SHA1 sha1() {
        return new SHA1();
    }

    public static String sha1(String data) throws NoSuchAlgorithmException {
        return sha1().digestHex(data);
    }

    public static String sha1(InputStream data) throws IOException, NoSuchAlgorithmException {
        return sha1().digestHex(data);
    }

    public static String sha1(byte[] data) throws NoSuchAlgorithmException {
        return sha1().digestHex(data);
    }


    /*======================================= SHA-256摘要 =======================================*/

    public static SHA256 sha256() {
        return new SHA256();
    }

    public static String sha256(String data) throws NoSuchAlgorithmException {
        return sha256().digestHex(data);
    }

    public static String sha256(InputStream data) throws IOException, NoSuchAlgorithmException {
        return sha256().digestHex(data);
    }

    public static String sha256(byte[] data) throws NoSuchAlgorithmException {
        return sha256().digestHex(data);
    }


    /*======================================= SHA-384摘要 =======================================*/

    public static SHA384 sha384() {
        return new SHA384();
    }

    public static String sha384(String data) throws NoSuchAlgorithmException {
        return sha384().digestHex(data);
    }

    public static String sha384(InputStream data) throws IOException, NoSuchAlgorithmException {
        return sha384().digestHex(data);
    }

    public static String sha384(byte[] data) throws NoSuchAlgorithmException {
        return sha384().digestHex(data);
    }


    /*======================================= SHA-512摘要 =======================================*/

    public static SHA512 sha512() {
        return new SHA512();
    }

    public static String sha512(String data) throws NoSuchAlgorithmException {
        return sha512().digestHex(data);
    }

    public static String sha512(InputStream data) throws IOException, NoSuchAlgorithmException {
        return sha512().digestHex(data);
    }

    public static String sha512(byte[] data) throws NoSuchAlgorithmException {
        return sha512().digestHex(data);
    }

}
